﻿using System;
using System.Collections.Generic;
using System.Text;

namespace IDAdmin.Lib.Utils
{
    public class NumberReader
    {
        /// <summary>
        /// Đọc 1 số
        /// </summary>
        /// <param name="s"></param>
        /// <param name="hang"></param>
        /// <returns></returns>
        public static string ReadOneNumber(string s, int hang)
        {
            string cachdoc = "";
            switch (s.Trim())
            {
                case "0":
                    if (hang == 1) { cachdoc = " mươi "; }
                    else if (hang == 2) { cachdoc = " linh "; }
                    else { cachdoc = " không "; }
                    break;
                case "1":
                    if (hang == 1) { cachdoc = " mốt "; }
                    else if (hang == 2) { cachdoc = " mười "; }
                    else { cachdoc = " một "; };
                    break;
                case "2":
                    cachdoc = " hai ";
                    break;
                case "3":
                    cachdoc = " ba ";
                    break;
                case "4":
                    cachdoc = " bốn ";
                    break;
                case "5":
                    cachdoc = " năm ";
                    break;
                case "6":
                    cachdoc = " sáu ";
                    break;
                case "7":
                    cachdoc = " bảy ";
                    break;
                case "8":
                    cachdoc = " tám ";
                    break;
                case "9":
                    cachdoc = " chín ";
                    break;
            }
            return cachdoc;
        }

        /// <summary>
        /// Chuỗi đọc 3 số
        /// </summary>
        /// <param name="so"></param>
        /// <param name="nhom"></param>
        /// <returns></returns>
        public static string ReadThreeNumber(string so, string nhom)
        {
            string chuoiso = so.Trim();
            string docchuoi = "";
            int n = chuoiso.Length;
            int hang = 0;
            for (int i = n - 1; i >= 0; i--)
            {
                string chu = chuoiso.Substring(i, 1);
                hang += 1;
                switch (hang)
                {
                    case 1:
                        docchuoi = ReadOneNumber(chu, hang) + docchuoi;
                        break;
                    case 2:
                        docchuoi = ReadOneNumber(chu, hang) + "mươi" + docchuoi;
                        break;
                    case 3:
                        docchuoi = ReadOneNumber(chu, hang) + "trăm" + docchuoi;
                        break;
                }
            }
            docchuoi = docchuoi.Trim();
            if (docchuoi.Trim() == "mươi")
            {
                docchuoi = "không";
            }
            else if (docchuoi == "mốt")
            {
                docchuoi = "một";
            }
            else
            {
                docchuoi = docchuoi.Replace("linh mươi", "linh");
                docchuoi = docchuoi.Replace("mươi mươi", "mươi");
                docchuoi = docchuoi.Replace("mười mươi", "mười");
                docchuoi = docchuoi.Replace("linh mươi", "");
                docchuoi = docchuoi.Replace("mười mốt", "mười một");
                docchuoi = docchuoi.Replace("linh mốt", "linh một");
                docchuoi = docchuoi.Replace("mươi năm", "mươi lăm");
                docchuoi = docchuoi.Replace("mười năm", "mười lăm");
            }
            docchuoi = docchuoi + nhom;
            return docchuoi;
        }

        /// <summary>
        /// Đọc số tiền bằng chuỗi
        /// </summary>
        /// <param name="so"></param>
        /// <returns></returns>
        public static string CurencyToString(double so)
        {
            try
            {
                long iSo = Math.Abs((long)so);
                string sSo = iSo.ToString().Trim();
                int cNhom = 0;
                string ketqua = "";
                string nhom = "";
                int n = sSo.Length;
                do
                {
                    cNhom += 1;
                    int k = n - 3 < 0 ? 0 : n - 3;
                    string s = sSo.Substring(k);
                    sSo = sSo.Remove(k);
                    n = sSo.Length;
                    switch (cNhom)
                    {
                        case 1:
                            nhom = "";
                            break;
                        case 2:
                            nhom = " ngàn ";
                            break;
                        case 3:
                            nhom = " triệu ";
                            break;
                        case 4:
                            nhom = " tỷ ";
                            break;
                    }
                    ketqua = ReadThreeNumber(s, nhom) + ketqua.Trim();
                }
                while (sSo != "");
                ketqua = ketqua + " đồng";
                ketqua = ketqua.Replace("  ", " ");
                ketqua = ketqua.Replace("không trăm đồng", "đồng");
                ketqua = ketqua.Replace("không trăm ngàn đồng", "đồng");
                return ketqua;
            }
            catch
            {
                return "Số tiền nhập không hợp lệ";
            }
        }

        /// <summary>
        /// Đọc chuỗi số
        /// </summary>
        /// <param name="so"></param>
        /// <returns></returns>
        public static string CurencyToString(string so)
        {
            try
            {
                string sSo = so.Trim();
                int cNhom = 0;
                string ketqua = "";
                string nhom = "";
                int n = sSo.Length;
                do
                {
                    cNhom += 1;
                    int k = n - 3 < 0 ? 0 : n - 3;
                    string s = sSo.Substring(k);
                    sSo = sSo.Remove(k);
                    n = sSo.Length;
                    switch (cNhom)
                    {
                        case 1:
                            nhom = "";
                            break;
                        case 2:
                            nhom = " ngàn ";
                            break;
                        case 3:
                            nhom = " triệu ";
                            break;
                        case 4:
                            nhom = " tỷ ";
                            break;
                    }
                    ketqua = ReadThreeNumber(s, nhom) + ketqua.Trim();
                }
                while (sSo != "");
                ketqua = ketqua + " đồng";
                ketqua = ketqua.Replace("  ", " ");
                ketqua = ketqua.Replace("không trăm đồng", "đồng");
                ketqua = ketqua.Replace("không trăm ngàn đồng", "đồng");
                return ketqua;
            }
            catch
            {
                return "Số tiền nhập không hợp lệ";
            }
        }
    }
}
